# -*- coding: utf-8 -*-
#定义一个接口
import StringIO
import pickle
class KeyDB():
   #依据KEY提取相应的VALUE值
   def __getitem__(self, key):
      raise NotImplementedError()
   #依据KEY提相应的数据。如果没有找到KEY就取其默认值default 还带上事务
   def get(self, key, default = None, txn = None):
      raise NotImplementedError()

   def __setitem__(self, key, val):
      raise NotImplementedError()

   def set(self, key, val):
      raise NotImplementedError()

#这个接口我们定义比较简单的功能API包括设置数据到内存。从内存区域读取数据
class MyKeyDB(KeyDB):
    def __setitem__(self, key, val):
        self.set(None, key, val)

    def set(self, key, val):
        dick = {key:val}
        buf = StringIO()                #内存文件句柄
        pickle.dump(dick, buf)           #将我们的值序列化到内存文件
    
    def __getitem__(self, key):
        if key is None:
            raise KeyError(key)
        return pickle.load(StringIO(val))
        #定义了一个set方法将指定key的数据先序列化到StringIO里面去。相当于是在内存我们创建了一个内存文件先把数据set进去。然后找到了这个KEY就可以提取出来
        #======数据从内存中提取出来之后就马上实现序列化处理！

    def get(self, key, default = None, txn = None):
        return pickle.load(StringIO(val))








class BDBKeyDB(KeyDB):
    """
        A data base that is accessible by a key.  All of the standard
        dictionary access methods are supported.
    """
    def __getitem__(self, key):
        val = self._db.get(key)
        if val is None:
            raise KeyError(key)
        return pickle.load(StringIO(val))
        #定义了一个set方法将指定key的数据先序列化到StringIO里面去。相当于是在内存我们创建了一个内存文件先把数据set进去。然后找到了这个KEY就可以提取出来
        #======数据从内存中提取出来之后就马上实现序列化处理！

    def get(self, key, default = None, txn = None):
        val = self._db.get(key, txn = txn and txn._txn)
        if val is None:
            return default
        else:
            return pickle.load(StringIO(val))

    def has_key(self, key):
        return self._db.get(key) is not None

    def __delitem__(self, key):
        self.delete(None, key)

    def delete(self, txn, key):
        self._db.delete(key, txn and txn._txn)

    def __setitem__(self, key, val):
        self.set(None, key, val)

    def set(self, txn, key, val):
        buf = StringIO()
        pickle.dump(val, buf)
        flattened = buf.getvalue()
        self._db.put(key, flattened, txn and txn._txn)

    
    
